﻿using FlyingCircusWebIS.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace FlyingCircusWebIS.Models
{
    public class CidadeService: ICidadeService
    {

        private ICidadeDAO cidadeDAO;
        private IAeroportoDAO aeroportoDAO;
        private IEnderecoDAO enderecoDAO;

        public CidadeService()
        {
            cidadeDAO = new CidadeDAO();
            aeroportoDAO = new AeroportoDAO();
            enderecoDAO = new EnderecoDAO();
        }

        public List<ValidationResult> ValidarEntidade(Cidade entidade)
        {
            List<ValidationResult> erros = new List<ValidationResult>();
            
            bool edicao = false;
            if (entidade.IdCidade != 0)
                edicao = true;

            if (edicao)
            {
                List<ValidationResult> errosAtualizar = ValidaAtualizar(entidade);
                if (errosAtualizar != null)
                    erros.AddRange(errosAtualizar);
            }
            else
            {
                List<ValidationResult> errosAdicionar = ValidaAdicionar(entidade);
                if (errosAdicionar != null)
                    erros.AddRange(errosAdicionar);
            }

            return erros;
        }

        public List<ValidationResult> ValidaAdicionar(Cidade entidade)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool existeNome = cidadeDAO.Listar().Any(e => e.NomeCidade.Equals(entidade.NomeCidade, StringComparison.InvariantCultureIgnoreCase) && e.UF.Equals(entidade.UF));
            if (existeNome)
                erros.Add(new ValidationResult("Já existe um registro com o nome informado."));


            return erros;
        }

        public List<ValidationResult> ValidaAtualizar(Cidade entidade)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool existeNome = cidadeDAO.Listar().Any(e => e.NomeCidade.Equals(entidade.NomeCidade, StringComparison.InvariantCultureIgnoreCase)
                                                    && e.UF.Equals(entidade.UF) && e.IdCidade != entidade.IdCidade);
            if (existeNome)
                erros.Add(new ValidationResult("Já existe um registro com o nome informado."));


            return erros;
        }


        public void Adicionar(Cidade entidade)
        {
            cidadeDAO.Adicionar(entidade);
        }

 

        public void Atualizar(Cidade entidade)
        {
            cidadeDAO.Atualizar(entidade);
        }


        public Cidade BuscarPorId(int id)
        {
            return cidadeDAO.BuscarPorId(id);
        }

        public List<Cidade> Listar()
        {
            return cidadeDAO.Listar();
        }

        public string BuscarUFCidadePorId(int id)
        {
            string uf = null;
            Cidade cidade = cidadeDAO.BuscarPorId(id);
            if (cidade != null)
                uf = cidade.UF;

            return uf;
        }

        public List<ValidationResult> ValidaRemoverPorId(int id)
        {
            List<ValidationResult> erros = new List<ValidationResult>();

            bool existe = cidadeDAO.Listar().Any(e => e.IdCidade == id);
            if (!existe)
                erros.Add(new ValidationResult("NaoExiste", "O registro solicitado não existe."));

            bool dependenciaAeroporto = aeroportoDAO.Listar().Any(e => e.IdCidade == id);
            if (dependenciaAeroporto)
                erros.Add(new ValidationResult("DependenciaAeroporto", "O registro tem dependência no contexto de aeroporto."));

            bool dependenciaEndereco = enderecoDAO.Listar().Any(e => e.IdCidade == id);
            if (dependenciaEndereco)
                erros.Add(new ValidationResult("DependenciaEndereco", "O registro tem dependência no contexto de endereço."));

            return erros;
        }


        public void RemoverPorId(int id)
        {
            cidadeDAO.RemoverPorId(id);
        }


        public List<SelectListItem> ListarItensCidadesPorUF(string UF)
        {
            List<Cidade> cidades = ListarCidadesPorUF(UF);
            List<SelectListItem> itens = ConverterRegistrosCidadesParaItens(cidades);
            return itens;
        }

        public List<Cidade> ListarCidadesPorUF(string UF)
        {
            List<Cidade> cidades = cidadeDAO.ListarCidadesPorUF(UF);
            return cidades;
        }

        public List<SelectListItem> ListarItensCidadesParaNovo()
        {
            List<SelectListItem> itens = new List<SelectListItem>();
            itens.Add(new SelectListItem() { Text = "<Nenhum>", Value = "" });
            return itens;
        }

        public List<SelectListItem> ListarItensCidadesAeroportosPorUF(string UF)
        {
            List<Cidade> cidades = cidadeDAO.ListarCidadesAeroportosPorUF(UF);
            List<SelectListItem> itens = ConverterRegistrosCidadesParaItens(cidades);

            return itens;
        }

        private List<SelectListItem> ConverterRegistrosCidadesParaItens(List<Cidade> cidades)
        {
            List<SelectListItem> itens = new List<SelectListItem>();
            itens.Add(new SelectListItem { Text = "<Nenhum>", Value = "" });
            foreach (var cidade in cidades)
            {
                itens.Add(new SelectListItem() { Text = cidade.NomeCidade, Value = cidade.IdCidade.ToString() });
            }
            return itens;
        }


        public List<SelectListItem> ListarItensUF()
        {
            List<SelectListItem> itens = new List<SelectListItem>();
            itens.Add(new SelectListItem { Text = "<Nenhum>", Value = "" });
            itens.Add(new SelectListItem { Text = "Acre", Value = "AC" });
            itens.Add(new SelectListItem { Text = "Alagoas", Value = "AL" });
            itens.Add(new SelectListItem { Text = "Amapá", Value = "AP" });
            itens.Add(new SelectListItem { Text = "Amazonas", Value = "AM" });
            itens.Add(new SelectListItem { Text = "Bahia", Value = "BA" });
            itens.Add(new SelectListItem { Text = "Ceará", Value = "CE" });
            itens.Add(new SelectListItem { Text = "Distrito Federal", Value = "DF" });
            itens.Add(new SelectListItem { Text = "Espírito Santo", Value = "ES" });
            itens.Add(new SelectListItem { Text = "Goiás", Value = "GO" });
            itens.Add(new SelectListItem { Text = "Maranhão", Value = "MA" });
            itens.Add(new SelectListItem { Text = "Mato Grosso", Value = "MT" });
            itens.Add(new SelectListItem { Text = "Mato Grosso do Sul", Value = "MS" });
            itens.Add(new SelectListItem { Text = "Minas Gerais", Value = "MG" });
            itens.Add(new SelectListItem { Text = "Pará", Value = "PA" });
            itens.Add(new SelectListItem { Text = "Paraíba", Value = "PB" });
            itens.Add(new SelectListItem { Text = "Paraná", Value = "PR" });
            itens.Add(new SelectListItem { Text = "Pernambuco", Value = "PE" });
            itens.Add(new SelectListItem { Text = "Piauí", Value = "PI" });
            itens.Add(new SelectListItem { Text = "Rio de Janeiro", Value = "RJ" });
            itens.Add(new SelectListItem { Text = "Rio Grande do Norte", Value = "RN" });
            itens.Add(new SelectListItem { Text = "Rio Grande do Sul", Value = "RS" });
            itens.Add(new SelectListItem { Text = "Rondônia", Value = "RO" });
            itens.Add(new SelectListItem { Text = "Roraima", Value = "RR" });
            itens.Add(new SelectListItem { Text = "Santa Catarina", Value = "SC" });
            itens.Add(new SelectListItem { Text = "São Paulo", Value = "SP" });
            itens.Add(new SelectListItem { Text = "Sergipe", Value = "SE" });
            itens.Add(new SelectListItem { Text = "Tocantins", Value = "TO" });

            return itens;
        }


    }
}